//package org.way.component;
//
//import cn.dev33.satoken.stp.StpUtil;
//import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
//import lombok.extern.slf4j.Slf4j;
//import net.sf.jsqlparser.expression.Expression;
//import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
//import net.sf.jsqlparser.expression.operators.relational.InExpression;
//import net.sf.jsqlparser.schema.Column;
//import net.sf.jsqlparser.schema.Table;
//import net.sf.jsqlparser.statement.select.PlainSelect;
//import net.sf.jsqlparser.statement.select.SelectExpressionItem;
//import net.sf.jsqlparser.statement.select.SubSelect;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.stereotype.Component;
//import org.way.dataPermission.DataPermission;
//import org.way.dataPermission.DataScopeEnum;
//import org.way.dto.SysPositionDto;
//import org.way.dto.UserPostDto;
//import org.way.service.impl.SysUserPostService;
//
//import javax.annotation.Resource;
//import java.lang.reflect.Method;
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;
//import java.util.Set;
//import java.util.stream.Collectors;
//
//@Component
//@Slf4j
//public class CustomerDataPermissionHandler implements DataPermissionHandler {
//
//    @Resource
//    private SysUserPostService userPostService;
//
//    @Override
//    public Expression getSqlSegment(Expression where, String mappedStatementId) {
//        try {
//            Class<?> clazz = Class.forName(mappedStatementId.substring(0, mappedStatementId.lastIndexOf(".")));
//            String methodName = mappedStatementId.substring(mappedStatementId.lastIndexOf(".") + 1);
//            Method[] methods = clazz.getDeclaredMethods();
//            // 没有注解，默认查询所有数据
//            DataPermission dataPermission = clazz.getAnnotation(DataPermission.class);
//            if(dataPermission == null)  {
//                return where;
//            }
//            if(methodName.contains("ById") || methodName.contains("ByIdList")) {
//                // todo
//            }
//
//            for (Method method : methods) {
//                // 保留方法上的自定义注解
//                if(!methodName.equals(method.getName())) {
//                    continue;
//                }
//                DataPermission annotation = method.getAnnotation(DataPermission.class);
//                if(annotation == null) {
//                    continue;
//                }
//                return dataScopeFilter(where);
//            }
//        } catch (Exception e) {
//            log.error(e.getMessage(),e);
//        }
//        return null;
//    }
//
//    private Expression dataScopeFilter(Expression where){
//        if(StpUtil.getLoginId() == null) {
//            // todo
//        }
//
//        // 找到用户的所有数据范围
//        List<SysPositionDto> positionList = new ArrayList<>();
//        List<UserPostDto> userPosition = userPostService.getUserPosition(StpUtil.getLoginId().toString());
//        userPosition.forEach(e->{
//            positionList.addAll(e.getPositionList());
//        });
//        Set<Integer> dataScopeSet = positionList.stream().map(SysPositionDto::getDataScope).collect(Collectors.toSet());
//
//        if(dataScopeSet.contains(DataScopeEnum.ALL.getType())) {
//            return where;
//        }
//        if(dataScopeSet.contains(DataScopeEnum.DEPT_AND_CHILD_DEPT.getType())) {
//            InExpression inExpression = new InExpression();
//            inExpression.setLeftExpression(buildColumn("t","dept_id"));
//            SubSelect subSelect = new SubSelect();
//            PlainSelect select = new PlainSelect();
//            select.setSelectItems(Collections.singletonList(new SelectExpressionItem(new Column("dept_id"))));
//            select.setFromItem(new Table("sys_dept"));
//
//            EqualsTo equalsTo = new EqualsTo();
//            equalsTo.setLeftExpression(new Column("dept_id"));
//        }
//        return null;
//    }
//
//    /**
//     * 构建Column
//     * @param tableAlias 表别名
//     * @param columnName 字段名称
//     * @return 带表别名字段
//     */
//    public static Column buildColumn(String tableAlias, String columnName) {
//        if (StringUtils.isNotEmpty(tableAlias)) {
//            columnName = tableAlias + "." + columnName;
//        }
//        return new Column(columnName);
//    }
//}
